package com.ruoyi.produce.report.produceAnalysis.service;

import com.ruoyi.constant.ERPConstant;
import com.ruoyi.produce.process.planself.domain.ProducePlanSelfDto;
import com.ruoyi.produce.process.planself.mapper.ProducePlanSelfMapper;
import com.ruoyi.produce.process.worksheet.domain.ProduceWorkSheet;
import com.ruoyi.produce.process.worksheet.mapper.ProduceWorkSheetMapper;
import com.ruoyi.produce.report.produceAnalysis.domain.ProduceAnalysis;
import com.ruoyi.produce.report.produceAnalysis.domain.ProduceAnalysisCond;
import com.ruoyi.produce.report.produceAnalysis.domain.ProduceAnalysisList;
import com.ruoyi.produce.report.produceAnalysis.mapper.ProduceAnalysisMapper;
import com.ruoyi.psi.purchase.apply.domain.PurchaseApply;
import com.ruoyi.psi.purchase.apply.mapper.PurchaseApplyMapper;
import com.ruoyi.utils.TimeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.sql.Timestamp;
import java.util.*;

/**
 * 生产分析
 * 业务逻辑
 */
@Service
public class ProduceAnalysisServiceImpl implements IProduceAnalysisService {
    @Autowired
    private ProduceAnalysisMapper produceAnalysisMapper;
    @Autowired
    private ProduceWorkSheetMapper workSheetMapper; //加工单
    @Autowired
    private ProducePlanSelfMapper planSelfMapper; //生产计划
    @Autowired
    private PurchaseApplyMapper purchaseApplyMapper; //采购申请

    @Override
    public List<ProduceAnalysis> selectProduceAnalysis(ProduceAnalysisCond cond) {
        List<ProduceAnalysis> produceAnalyses = produceAnalysisMapper.selectProduceAnalysis(cond);
        for (ProduceAnalysis item : produceAnalyses) {
            // 判断生产计划
            // 计算生产计划的提前完成时间
            if (item.getStartTime() != null && item.getPredictedFinishingTime() != null) {
                if (item.getEndTime() != null) {
                    // 说明生产计划完成
                    item.setProductionTime(TimeUtil.TimeSubtraction(item.getEndTime(), item.getStartTime()) + 1);
                    long time = TimeUtil.TimeSubtraction(item.getPredictedFinishingTime(), item.getEndTime());
                    if (time >= 0) {
                        time += 1;
                    } else {
                        time -= 1;
                    }
                    item.setAdvanceTime(time);
                } else {
                    // 未完成
                    item.setProductionTime(999999999);
                    item.setAdvanceTime(999999999);
                }
            } else {
                // 开始时间和预计完成时间为空，无法计算
                item.setProductionTime(999999999);
                item.setAdvanceTime(999999999);
            }

            List<ProduceAnalysisList> produceAnalysisLists = new ArrayList<>(); //子表集合
            // 通过生产计划编号查询加工单
            List<ProduceWorkSheet> produceWorkSheets = workSheetMapper.selectProduceWorkSheetByPlanSelfId(item.getPlanSelfId());
            for (int i = 0; i < produceWorkSheets.size(); i++) {
                ProduceAnalysisList produceAnalysisList = new ProduceAnalysisList(
                        produceWorkSheets.get(i).getWorkSheetId(),
                        produceWorkSheets.get(i).getCompletionStatus(),
                        produceWorkSheets.get(i).getWorkSheetNumber(),
                        produceWorkSheets.get(i).getCompletedNumber(),
                        produceWorkSheets.get(i).getStartTime(),
                        produceWorkSheets.get(i).getPredictedFinishingTime()
                );
                //计算加工单的时间
                if (produceWorkSheets.get(i).getStartTime() != null && produceWorkSheets.get(i).getPredictedFinishingTime() != null) {
                    if (produceWorkSheets.get(i).getEndTime() != null) {
                        // 说明加工单完成
                        produceAnalysisList.setProductionTime(TimeUtil.TimeSubtraction(produceWorkSheets.get(i).getEndTime(), produceWorkSheets.get(i).getStartTime()) + 1); //生产完成时间
                        long time = TimeUtil.TimeSubtraction(produceWorkSheets.get(i).getPredictedFinishingTime(), produceWorkSheets.get(i).getEndTime());
                        if (time >= 0) {
                            time += 1;
                        } else {
                            time -= 1;
                        }
                        produceAnalysisList.setAdvanceTime(time); //提前时间
                        produceAnalysisList.setEndTime(produceWorkSheets.get(i).getEndTime());
                    } else {
                        // 结束时间为空，无法计算
                        produceAnalysisList.setProductionTime(999999999); //999999999代表无法计算，前端显示空
                        // 用当前时间和预计完成时间对比
                        Timestamp now = new Timestamp(new Date().getTime());
                        long time = TimeUtil.TimeSubtraction(produceWorkSheets.get(i).getPredictedFinishingTime(), now);
                        if (time < 0) {
                            // 说明逾期
                            produceAnalysisList.setAdvanceTime(time - 1); //逾期是负数，多减一天
                        } else {
                            // 正常未完成，前端不显示
                            produceAnalysisList.setAdvanceTime(999999999);
                        }
                    }
                } else {
                    // 开始时间和预计完成时间为空，无法计算
                    produceAnalysisList.setProductionTime(999999999); //999999999代表无法计算，前端显示空
                    produceAnalysisList.setAdvanceTime(999999999);
                }
                produceAnalysisLists.add(produceAnalysisList);
            }
            item.setProduceAnalysisLists(produceAnalysisLists);
        }
        return produceAnalyses;
    }

    /**
     * 查看生产计划的生产建议
     *
     * @param planSelfId
     * @return
     */
    @Override
    public StringBuffer searchProductionPlanAdvice(String planSelfId) {
        StringBuffer advice = new StringBuffer();//因为可能有多个加工单，在外侧做一个字符串拼接

        //查看是否有对应的加工单
        List<ProduceWorkSheet> produceWorkSheets = workSheetMapper.selectProduceWorkSheetByPlanSelfId(planSelfId);
        ProducePlanSelfDto producePlan = planSelfMapper.selectProducePlanSelfById(planSelfId);
        if (produceWorkSheets.size() == 0) {
            // 无加工单，找是否有采购订单
            String prefix = "生产计划处于生产准备阶段，建议尽快下达加工生产#";
            StringBuffer purchaseAdvice = new StringBuffer();
            if (producePlan.getSaleOrderId() == null) {
                String str = "无销售订单，无法查询采购情况";
                purchaseAdvice.append(str);
            } else {
                List<PurchaseApply> purchaseApplies = purchaseApplyMapper.selectPurchaseApplyBySaleOrderId(producePlan.getSaleOrderId());//通过生产计划关联的销售订单查询采购情况
                String str;
                if (purchaseApplies.size() == 0) {
                    // 无采购情况
                    str = "且该生产计划对应的销售订单暂无采购情况";
                } else {
                    // 有采购情况
                    str = "且有对应的采购订单，物料正在采购中";
                }
                purchaseAdvice.append(str);
            }
            advice.append(prefix).append(purchaseAdvice);
        } else {
            // 有加工情况
            StringBuffer prefix = new StringBuffer();
            StringBuffer workSheetAdvice = new StringBuffer();
            if (producePlan.getCompletionStatus().equals(ERPConstant.COMMON_FINISHED)) {
                // 生产计划完成
                prefix.append("当前生产计划已完成#")
                        .append("预计需要: ")
                        .append(TimeUtil.TimeSubtraction(producePlan.getPredictedFinishingTime(), producePlan.getStartTime()) + 1)
                        .append("天完成；实际完成天数：")
                        .append(TimeUtil.TimeSubtraction(producePlan.getEndTime(), producePlan.getStartTime()) + 1).append("天；提前")
                        .append(TimeUtil.TimeSubtraction(producePlan.getPredictedFinishingTime(), producePlan.getEndTime()) + 1)
                        .append("天完成");
//                for (ProduceWorkSheet item : produceWorkSheets) {
//                    // 计算周期
//                    StringBuffer str = new StringBuffer();
//                    long time = SaleOrderUtil.TimeSubtraction(item.getPredictedFinishingTime(), item.getEndTime());
//                    if (time >= 0) {
//                        time += 1;
//                    } else {
//                        time -= 1;
//                    }
//                    str.append("加工单: ").append(item.getWorkSheetId()).append("，已生产完成，生产周期为").append(SaleOrderUtil.TimeSubtraction(item.getStartTime(), item.getEndTime()) + 1).append("天，提前").append(time).append("天完成#");
//                    workSheetAdvice.append(str);
//                }
            } else {
                // 生产计划未完成
                prefix.append("当前生产计划正处于加工过程中#");
//                for (ProduceWorkSheet item : produceWorkSheets) {
//                    //未完成
//                    // 计算预定工期时间
//                    if (item.getStartTime() != null && item.getPredictedFinishingTime() != null) {
//                        // 开始和预计结束时间不为空时
//                        Timestamp now = new Timestamp(new Date().getTime());
//                        long day = SaleOrderUtil.TimeSubtraction(item.getPredictedFinishingTime(), now);
//                        if (day >= 0) {
//                            day += 1;
//                        } else {
//                            day -= 1;
//                        }
//                        StringBuffer str = new StringBuffer();
//                        str.append("加工单：").append(item.getWorkSheetId()).append("离预计完成时间还剩").append(day).append("天#");
//                        workSheetAdvice.append(str);
//                    } else {
//                        // 时间为空，无法计算
//                        workSheetAdvice.append("加工单：").append(item.getWorkSheetId()).append("开始时间和预计完成时间不明确，无法做出准确建议#");
//                    }
//                }
            }
//            StringBuffer workSheetAdvice = new StringBuffer();
            // 有加工单，先看是否完成
            for (ProduceWorkSheet item : produceWorkSheets) {
                if (item.getCompletionStatus().equals(ERPConstant.COMMON_UNFINISHED)) {
                    //未完成
                    // 计算预定工期时间
                    if (item.getStartTime() != null && item.getPredictedFinishingTime() != null) {
                        // 开始和预计结束时间不为空时
                        Timestamp now = new Timestamp(new Date().getTime());
                        long day = TimeUtil.TimeSubtraction(item.getPredictedFinishingTime(), now);
                        if (day >= 0) {
                            day += 1;
                        } else {
                            day -= 1;
                        }
                        StringBuffer str = new StringBuffer();
                        str.append("加工单：").append(item.getWorkSheetId()).append("离预计完成时间还剩").append(day).append("天#");
                        workSheetAdvice.append(str);
                    } else {
                        // 时间为空，无法计算
                        workSheetAdvice.append("加工单：").append(item.getWorkSheetId()).append("开始时间和预计完成时间不明确，无法做出准确建议#");
                    }
                } else {
                    // 完成
                    // 计算周期
                    StringBuffer str = new StringBuffer();
                    long time = TimeUtil.TimeSubtraction(item.getPredictedFinishingTime(), item.getEndTime());
                    if (time >= 0) {
                        time += 1;
                    } else {
                        time -= 1;
                    }
                    str.append("加工单: ").append(item.getWorkSheetId()).append("，已生产完成，生产周期为").append(TimeUtil.TimeSubtraction(item.getEndTime(), item.getStartTime()) + 1).append("天，提前").append(time).append("天完成#");
                    workSheetAdvice.append(str);
                }
            }
            advice.append(prefix).append(workSheetAdvice);

        }
        return advice;
    }
}
